/*
 * @Author: your name
 * @Date: 2021-06-01 14:21:02
 * @LastEditTime: 2021-06-02 14:22:44
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \bazai_island_api\app\models\user.js
 */
const bcrypt = require('bcryptjs')
const { Sequelize, Model } = require('sequelize')
const { sequelize } = require('../../core/mysqlDB')


class User extends Model {
  static async verifyEmailPassword(email, plainPassword) {
    const user = await User.findOne({
      where: {
        email
      }
    })
    if (!user){
      throw new global.errs.NotFound('账号不存在')
    }
    // 解密判断密码是否正确
    const correct = bcrypt.compareSync(plainPassword, user.password)
    if (!correct) {
      throw new global.errs.AuthFailed('密码不正确')
    }
    return user
  }
  
  static async getUserByOpenid(openid) {
    const user = await User.findOne({
        where: {
            openid
        }
    })
    return user
  }

  static async registerByOpenid(openid) {
    return await User.create({
        openid
    })
  }
}

User.init({
    // 主键 关系型数据库
    // 主键：不能重复 不能为空
    // 注册 User id 设计 id编号系统600001 
    // 自动增长id编号
    // 数字 字符串，随机字符串 GUID
    // 并发，1000 注册
    // 接口保护 权限 访问接口 token
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    nickname: Sequelize.STRING,
    email: {
        type: Sequelize.STRING(128),
        unique: true
    },
    password: {
      // 扩展  设计模式 观察者模式
      // ES6 Reflect Vue3.0有用到
      type: Sequelize.STRING,
      // 对密码进行赋值的话,自动调用
      set(val) {
        const salt = bcrypt.genSaltSync(10) // 加密难度
        // 位数, 成本
        // 明文,加密 不同, 彩虹攻击
        const psw = bcrypt.hashSync(val, salt)
        // 保存密码
        this.setDataValue('password', psw)
      }
    },
    openid: {
        type: Sequelize.STRING(64),
        unique: true
    }
}, { 
    sequelize,
    tableName: 'user'
})

// 数据迁移 SQL 更新 风险

module.exports = {
    User
}

